package com.zlk.algorithm.algorithm.recursion;

import java.util.Stack;

/**
 * @program: algorithm
 * @ClassName ReverseStackUsingRecursive
 * @description:给定一个栈，请逆序这个栈，不能申请额外的数据结构，只能使用递归函数
 * @author: slfang
 * @create: 2024-03-25 14:56
 * @Version 1.0
 **/
public class ReverseStackUsingRecursive {


    /**
     * 2层递归
     * 第一层递归反转
     *   拿到第二层递归获取的pop栈底元素 然后push
     *
     * 第二层递归
     *    pop栈底元素
     * @param stack
     */
    public static void reverse(Stack<Integer> stack) {
        if (stack.isEmpty()) {
            return;
        }
        //pop栈底元素
        int i = f(stack);
        reverse(stack);
        stack.push(i);
    }

    // 栈底元素移除掉  1  2  3
    // 上面的元素盖下来
    // 返回移除掉的栈底元素
    public static int f(Stack<Integer> stack) {
        int result = stack.pop();
        if (stack.isEmpty()) {
            return result;
        } else {
            int last = f(stack);
            stack.push(result);
            return last;
        }
    }

    public static void main(String[] args) {
        Stack<Integer> test = new Stack<Integer>();
        test.push(1);
        test.push(2);
        test.push(3);
        test.push(4);
        test.push(5);
        reverse(test);
        while (!test.isEmpty()) {
            System.out.println(test.pop());
        }

    }
}
